//package com.gaga.console.core.service.impl;
//
//import cn.hutool.core.bean.BeanUtil;
//import com.alibaba.fastjson.JSONObject;
//import com.gaga.common.entity.charts.ChartData;
//import com.gaga.common.entity.charts.ColumnData;
//import com.gaga.common.entity.charts.SeriesData;
//import com.gaga.common.enums.ChartType;
//import com.gaga.common.enums.CodeEnum;
//import com.gaga.common.result.ProcResult;
//import com.gaga.console.base.utils.DriverUtils;
//import com.gaga.console.core.entity.vo.ProcVO;
//import com.gaga.console.core.service.ProcService;
//import com.gaga.metadata.common.enums.TransFormType;
//import com.gaga.metadata.common.utils.StringUtils;
//import com.gaga.metadata.driver.Driver;
//import com.gaga.metadata.result.JdbcSelectResult;
//import com.google.common.collect.Lists;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import java.util.ArrayList;
//import java.util.LinkedHashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.atomic.AtomicReference;
//import java.util.stream.Collectors;
//
///**
// * @author liujia
// * @version 1.0
// * @date 2023/11/21-14:37
// */
//@Service
//public class ProcServiceImpl implements ProcService {
//
//
//    @Autowired
//    private DriverUtils driverUtils;
//
//    @Override
//    public ProcResult getData(ProcVO procVO) {
//        AtomicReference<String> sql = new AtomicReference<>();
//
//
//        Driver driver = driverUtils.getDataBaseDriver();
//
//        getProcSql(TransFormType.ofCode(driverUtils.driverConfig().getType()), procVO, sql);
//        if(StringUtils.isBlank(sql.get())){
//            throw  new RuntimeException("获取sql失败");
//        }
//        Object result = null;
//        ProcResult procResult = new ProcResult();
//        try {
//        JdbcSelectResult jdbcSelectResult = driver.query(sql.get(), 1000);
//
//            if (null != jdbcSelectResult && jdbcSelectResult.getRowData().size() > 0) {
//                List<LinkedHashMap<String, Object>> rowData = jdbcSelectResult.getRowData();
//                LinkedHashMap<String, Object> firstData = rowData.get(0);
//                List<SeriesData> seriesDatas = Lists.newLinkedList();
//                Integer chartType = Integer.valueOf(firstData.get("chart_type").toString());
//
//                List<JSONObject> jsonObjectList = new ArrayList<>();
//                rowData.forEach(row -> jsonObjectList.add(BeanUtil.mapToBean(row, JSONObject.class, true)));
//
//                if (ChartType.CARD.getCode().intValue() == chartType) {
//                    seriesDatas.add(parseCardData(jsonObjectList));
//                    result = seriesDatas;
//                } else if (ChartType.CHART.getCode().intValue() == chartType) {
//                    seriesDatas.addAll(parseChartsData(jsonObjectList));
//                    result = seriesDatas;
//                } else if (ChartType.TABLE.getCode().intValue() == chartType) {
//                    result = parseTableData(jsonObjectList);
//                } else if (ChartType.COMBINER.getCode().intValue() == chartType) {
//                    seriesDatas.add(parseTableData(jsonObjectList));
//                    result = seriesDatas;
//                }
//            }
//            procResult.setCode(CodeEnum.SUCCESS.getCode());
//            procResult.setResult(result);
//        }catch (Exception e){
//            e.printStackTrace();
//        }finally {
//            driver.close();
//        }
//        return procResult;
//    }
//
//    private void getProcSql(TransFormType transFormType, ProcVO procVO, AtomicReference<String> sql){
//        switch (transFormType) {
//            case Mysql:
//                sql.set("CALL " + procVO.getProcName() + "('" + procVO.getCode() +"','" + procVO.getXmlParams() + "')");
//                break;
//            case Oracle:
//                sql.set("{ CALL " + procVO.getProcName() + "('" + procVO.getCode() +"','" + procVO.getXmlParams() + "',?)" + "}");
//                break;
//            case Postgresql:
//            case Postgres:
//                sql.set("{? =  CALL " + procVO.getProcName() + "('" + procVO.getCode() +"','" + procVO.getXmlParams() + "'}");
//                break;
//            default:
//                sql.set("exec " + procVO.getProcName() + "'" + procVO.getCode() +"','" + procVO.getXmlParams() + "'");
//                break;
//        }
//    }
//
//
//    /**
//     * 外部存储过程，卡片数据转换
//     *
//     * @param jsonObjectList
//     * @return
//     */
//    protected SeriesData parseCardData(List<JSONObject> jsonObjectList) {
//        //表格返回结果集
//        SeriesData seriesData = new SeriesData(Lists.newLinkedList());
//
//        List cartList = new ArrayList<>();
//        // 每一行数据解析
//        jsonObjectList.forEach(item -> {
//            Map<String, Object> cartMap = new LinkedHashMap<>();
//            cartMap.put("aliasName", item.getString("field_title"));
//            cartMap.put("name", item.getString("field_title"));
//            cartMap.put("title", item.getString("field_name"));
//            cartMap.put("value", item.getString("field_value"));
//            cartMap.put("realValue", item.getString("field_value"));
//            cartMap.put("targetValue", item.getString("field_target_value"));
//            cartMap.put("unit", item.getString("field_unit"));
//            cartList.add(cartMap);
//        });
//
//        seriesData.setDataList(cartList);
//        seriesData.setTotal(cartList.size());
//        return seriesData;
//    }
//
//    /**
//     * 外部存储过程，卡片、图表数据转换
//     *
//     * @param jsonObjectList
//     * @return
//     */
//    protected List<SeriesData> parseChartsData(List<JSONObject> jsonObjectList) {
//        //卡片、图表返回结果集
//        List<SeriesData> seriesDatas = Lists.newLinkedList();
//        // 用于保存系列的顺序
//        List<String> sortList = Lists.newLinkedList();
//        Map<String, List<ChartData>> map = jsonObjectList.stream().collect(Collectors.toMap(item -> item.getString("group_name"),
//                // 此时的value 为集合，方便重复时操作
//                item -> {
//                    List<ChartData> group = new ArrayList<>();
//                    ChartData chartData = new ChartData();
//                    chartData.setAliasName(item.getString("field_title"));
//                    chartData.setName(item.getString("field_title"));
//                    chartData.setTitle(item.getString("field_name"));
//                    chartData.setValue(item.getString("field_value"));
//                    chartData.setRealValue(item.getString("field_value"));
//                    chartData.setTargetValue(item.getString("field_target_value"));
//                    chartData.setUnit(item.getString("field_unit"));
//                    chartData.setRemark(item.getString("field_remark"));
//                    group.add(chartData);
//                    sortList.add(item.getString("group_name")); //保存系列的初始顺序
//                    return group;
//                },
//                // 重复时将现在的值全部加入到之前的值内
//                (List<ChartData> value1, List<ChartData> value2) -> {
//                    value1.addAll(value2);
//                    return value1;
//                }
//        ));
//
//        // 对map按照初始顺序重新排序
//        Map<String, List<ChartData>> newMap = new LinkedHashMap<>();
//        sortList.forEach(key -> {
//            newMap.put(key, map.get(key));
//        });
//
//        newMap.forEach((k, v) -> {
//            seriesDatas.add(new SeriesData(k, v));
//        });
//
//        return seriesDatas;
//    }
//
//
//    /**
//     * 外部存储过程，表格数据转换
//     *
//     * @param jsonObjectList
//     * @return
//     */
//    protected SeriesData parseTableData(List<JSONObject> jsonObjectList) {
//        SeriesData seriesData = new SeriesData(Lists.newLinkedList()); //表格返回结果集
//        List<Map<String, Object>> dataList = Lists.newLinkedList(); //表格数据
//        List<ColumnData> columnDataList = Lists.newLinkedList(); //表格字段名列表
//
//        jsonObjectList.stream().forEach(item -> {
//            Map<String, Object> newMap = new LinkedHashMap<>();
//            item.forEach((k, v) -> {
//                if (!"chart_type".equals(k)) {
//                    newMap.put(k, v);
//                }
//            });
//            dataList.add(newMap);
//        });
//
//        //设置总数
//        if (jsonObjectList.size() > 0) {
//            JSONObject item = jsonObjectList.get(0);
//            if (item.containsKey("total")) {
//                seriesData.setTotal(item.getIntValue("total"));
//            } else {
//                seriesData.setTotal(dataList.size());
//            }
//        }
//
//        //设置columns
//        buildColumns(dataList, columnDataList);
//
//        seriesData.columnList(columnDataList).setDataList(dataList);
//
//        return seriesData;
//    }
//
//
//
//    private void buildColumns(List<Map<String, Object>> dataList, List<ColumnData> columnDataList) {
//        if (dataList.stream().findFirst().isPresent()) {
//            for (Map.Entry<String, Object> entry : dataList.stream().findFirst().get().entrySet()) {
//                String columnName = entry.getKey();
//                ColumnData columnData = new ColumnData();
//                columnData.setTitle(columnName);
//                columnData.setField(columnName);
//                columnDataList.add(columnData);
//            }
//        }
//    }
//
//}
